package br.com.imob.modelo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author Gilton Nascimento
 */
@Entity
@Table(name = "\"IMOVEL\"", catalog = "imob", schema = "public")
@NamedQueries({
    @NamedQuery(name = "Imovel.findAll", query = "SELECT i FROM Imovel i"),
    @NamedQuery(name = "Imovel.findByImovelId", query = "SELECT i FROM Imovel i WHERE i.imovelId = :imovelId"),
    
    @NamedQuery(name = "Imovel.findByDscInterna", query = "SELECT i FROM Imovel i WHERE i.dscInterna = :dscInterna"),
    @NamedQuery(name = "Imovel.findLikeByDscInterna", query = "SELECT i FROM Imovel i WHERE i.dscInterna Like :dscInterna"),
    
    @NamedQuery(name = "Imovel.findByDscExterna", query = "SELECT i FROM Imovel i WHERE i.dscExterna = :dscExterna"),
    @NamedQuery(name = "Imovel.findLikeByDscExterna", query = "SELECT i FROM Imovel i WHERE i.dscExterna Like :dscExterna"),
    
    @NamedQuery(name = "Imovel.findByAcabamentoInterno", query = "SELECT i FROM Imovel i WHERE i.acabamentoInterno = :acabamentoInterno"),
    @NamedQuery(name = "Imovel.findLikeByAcabamentoInterno", query = "SELECT i FROM Imovel i WHERE i.acabamentoInterno Like :acabamentoInterno"),
    
    @NamedQuery(name = "Imovel.findByAcabamentoExterno", query = "SELECT i FROM Imovel i WHERE i.acabamentoExterno = :acabamentoExterno"),
    @NamedQuery(name = "Imovel.findLikeByAcabamentoExterno", query = "SELECT i FROM Imovel i WHERE i.acabamentoExterno Like :acabamentoExterno"),
    
    @NamedQuery(name = "Imovel.findByExtra", query = "SELECT i FROM Imovel i WHERE i.extra = :extra"),
    @NamedQuery(name = "Imovel.findLikeByExtra", query = "SELECT i FROM Imovel i WHERE i.extra Like :extra"),
    
    @NamedQuery(name = "Imovel.findByQuarto", query = "SELECT i FROM Imovel i WHERE i.quarto = :quarto"),
    @NamedQuery(name = "Imovel.findBySuite", query = "SELECT i FROM Imovel i WHERE i.suite = :suite"),
    @NamedQuery(name = "Imovel.findByValor", query = "SELECT i FROM Imovel i WHERE i.valor = :valor"),
    
    @NamedQuery(name = "Imovel.findByIptu", query = "SELECT i FROM Imovel i WHERE i.iptu = :iptu"),
    @NamedQuery(name = "Imovel.findLikeByIptu", query = "SELECT i FROM Imovel i WHERE i.iptu Like :iptu"),
    
    @NamedQuery(name = "Imovel.findByDataCadastro", query = "SELECT i FROM Imovel i WHERE i.dataCadastro = :dataCadastro"),
    
    @NamedQuery(name = "Imovel.findByTitulo", query = "SELECT i FROM Imovel i WHERE i.titulo = :titulo"),
    @NamedQuery(name = "Imovel.findLikeByTitulo", query = "SELECT i FROM Imovel i WHERE i.titulo Like :titulo"),
    
    @NamedQuery(name = "Imovel.findBySituacao", query = "SELECT i FROM Imovel i WHERE i.situacao = :situacao"),
    @NamedQuery(name = "Imovel.findLikeBySituacao", query = "SELECT i FROM Imovel i WHERE i.situacao Like :situacao"),
    
    @NamedQuery(name = "Imovel.findByFrente", query = "SELECT i FROM Imovel i WHERE i.frente = :frente"),
    @NamedQuery(name = "Imovel.findByFundo", query = "SELECT i FROM Imovel i WHERE i.fundo = :fundo"),
    @NamedQuery(name = "Imovel.findByLadoEsquerdo", query = "SELECT i FROM Imovel i WHERE i.ladoEsquerdo = :ladoEsquerdo"),
    @NamedQuery(name = "Imovel.findByLadoDireito", query = "SELECT i FROM Imovel i WHERE i.ladoDireito = :ladoDireito"),
    
    @NamedQuery(name = "Imovel.findByAreaLote", query = "SELECT i FROM Imovel i WHERE i.areaLote = :areaLote"),
    @NamedQuery(name = "Imovel.findLikeByAreaLote", query = "SELECT i FROM Imovel i WHERE i.areaLote Like :areaLote"),
    
    @NamedQuery(name = "Imovel.findByAreaPrivativa", query = "SELECT i FROM Imovel i WHERE i.areaPrivativa = :areaPrivativa"),
    @NamedQuery(name = "Imovel.findByAreaTotal", query = "SELECT i FROM Imovel i WHERE i.areaTotal = :areaTotal"),
    
    @NamedQuery(name = "Imovel.findByEntrega", query = "SELECT i FROM Imovel i WHERE i.entrega = :entrega"),
    @NamedQuery(name = "Imovel.findLikeByEntrega", query = "SELECT i FROM Imovel i WHERE i.entrega Like :entrega"),
    
    @NamedQuery(name = "Imovel.findByCondominio", query = "SELECT i FROM Imovel i WHERE i.condominio = :condominio"),
    @NamedQuery(name = "Imovel.findByEmplacado", query = "SELECT i FROM Imovel i WHERE i.emplacado = :emplacado"),
    @NamedQuery(name = "Imovel.findByExclusiva", query = "SELECT i FROM Imovel i WHERE i.exclusiva = :exclusiva"),
    
    @NamedQuery(name = "Imovel.findByFoto", query = "SELECT i FROM Imovel i WHERE i.foto = :foto"),
    @NamedQuery(name = "Imovel.findLikeByFoto", query = "SELECT i FROM Imovel i WHERE i.foto Like :foto")
    })
    
public class Imovel extends ControlEntities implements Serializable {
    
	private static final long serialVersionUID = 1L;
    
    @Id
//  <editor-fold defaultstate="collapsed" desc="Geradores de Sequencias">
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_STORE")
    @SequenceGenerator(name = "SEQ_STORE", sequenceName = "next_imovel")// </editor-fold>
    @Basic(optional = false)
    @Column(name = "imovel_id", nullable = false)
    private Integer imovelId;
    
    @Column(name = "dsc_interna", length = 2147483647)
    private String dscInterna;
    
    @Column(name = "dsc_externa", length = 2147483647)
    private String dscExterna;
    
    @Column(name = "acabamento_interno", length = 2147483647)
    private String acabamentoInterno;
    
    @Column(name = "acabamento_externo", length = 2147483647)
    private String acabamentoExterno;
    
    @Column(name = "extra", length = 2147483647)
    private String extra;
    
    @Column(name = "quarto")
    private Integer quarto;
    
    @Column(name = "suite")
    private Integer suite;
    
    @Basic(optional = false)
    @Column(name = "valor", nullable = false)
    private double valor;
    
    @Basic(optional = false)
    @Column(name = "iptu", nullable = false, length = 100)
    private String iptu;
    
    @Column(name = "data_cadastro")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataCadastro;
    
    @Basic(optional = false)
    @Column(name = "titulo", nullable = false, length = 50)
    private String titulo;
    
    @Column(name = "frente")
    private Integer frente;
    
    @Column(name = "fundo")
    private Integer fundo;
    
    @Column(name = "lado_esquerdo")
    private Integer ladoEsquerdo;
    
    @Column(name = "lado_direito")
    private Integer ladoDireito;
    
    @Column(name = "area_lote", length = 10)
    private String areaLote;
    
    @Column(name = "area_privativa")
    private Integer areaPrivativa;
    
    @Column(name = "area_total")
    private Integer areaTotal;
    
    @Column(name = "entrega", length = 20)
    private String entrega;
    
    @Column(name = "condominio", precision = 17, scale = 17)
    private Double condominio;
    
    @Column(name = "emplacado")
    private Boolean emplacado;
    
    @Column(name = "exclusiva")
    private Boolean exclusiva;
    
    @Column(name = "foto", length = 2147483647)
    private String foto;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "imovel", fetch = FetchType.LAZY)
    private List<AcompanhamentoJuridico> acompanhamentoJuridicoList;
    
    @JoinColumn(name = "tipo_imovel_id", referencedColumnName = "tipo_imovel_id", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private TipoImovel tipoImovel;
    
    @JoinColumn(name = "situacao_id", referencedColumnName = "situacao_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Situacao situacao;
    
    @JoinColumn(name = "proprietario_cliente", referencedColumnName = "pessoa_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Pessoa pessoa;
    
    @JoinColumn(name = "autonomo_id", referencedColumnName = "pessoa_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Pessoa pessoa1;
    
    @JoinColumn(name = "origem_id", referencedColumnName = "origem_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Origem origem;
    
    @JoinColumn(name = "negocio_id", referencedColumnName = "negocio_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Negocio negocio;
    
    @JoinColumn(name = "finalidade_id", referencedColumnName = "finalidade_id", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Finalidade finalidade;
    
    @JoinColumn(name = "face_id", referencedColumnName = "face_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Face face;
    
    @JoinColumn(name = "empresa_id", referencedColumnName = "empresa_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Empresa empresa;
    
    @JoinColumn(name = "classificacao_id", referencedColumnName = "classificacao_id", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Classificacao classificacao;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "imovel", fetch = FetchType.LAZY)
    private List<AcompanhamentoFisico> acompanhamentoFisicoList;

    public Imovel() { }
    public Imovel(Integer imovelId) { this.imovelId = imovelId; }

    public Imovel(Integer imovelId, double valor, String iptu, String titulo) {
        this.imovelId = imovelId;
        this.valor = valor;
        this.iptu = iptu;
        this.titulo = titulo;
    }
    
    public Imovel( String tpStr, String arg ) { 
    	if( "dscInterna".equalsIgnoreCase( tpStr ) )		dscInterna = arg;
    	if( "dscExterna".equalsIgnoreCase( tpStr ) )		dscExterna = arg;
    	if( "acabamentoInterno".equalsIgnoreCase( tpStr ) ) acabamentoInterno = arg;
    	if( "acabamentoExterno".equalsIgnoreCase( tpStr ) )	acabamentoExterno = arg;
    	if( "extra".equalsIgnoreCase( tpStr ) )				extra = arg;
    	if( "quarto".equalsIgnoreCase( tpStr ) )			quarto = str2Integer(arg);
    	if( "suite".equalsIgnoreCase( tpStr ) )				suite = str2Integer(arg);
    	if( "valor".equalsIgnoreCase( tpStr ) )				valor = str2Double(arg);
    	if( "iptu".equalsIgnoreCase( tpStr ) )				iptu = arg;
    	if( "dataCadastro".equalsIgnoreCase( tpStr ) )		dataCadastro = str2Date(arg);
    	if( "titulo".equalsIgnoreCase( tpStr ) )			titulo = arg;
    	if( "situacao".equalsIgnoreCase( tpStr ) )			situacao.setSituacao(arg);
    	if( "frente".equalsIgnoreCase( tpStr ) )			frente = str2Integer(arg);
    	if( "fundo".equalsIgnoreCase( tpStr ) )				fundo = str2Integer(arg);
    	if( "ladoDireito".equalsIgnoreCase( tpStr ) )		ladoDireito = str2Integer(arg);
    	if( "ladoEsquerdo".equalsIgnoreCase( tpStr ) )		ladoEsquerdo = str2Integer(arg);
    	if( "areaLote".equalsIgnoreCase( tpStr ) )			areaLote = arg;
    	if( "areaPrivativa".equalsIgnoreCase( tpStr ) )		areaPrivativa = str2Integer(arg);
    	if( "areaTotal".equalsIgnoreCase( tpStr ) )			areaTotal = str2Integer(arg);
    	if( "entrega".equalsIgnoreCase( tpStr ) )			entrega = arg;
    	if( "condominio".equalsIgnoreCase( tpStr ) )		condominio = str2Double(arg);
    	if( "emplacado".equalsIgnoreCase( tpStr ) )		 	emplacado = str2Boolean(arg);
    	if( "exclusiva".equalsIgnoreCase( tpStr ) )			exclusiva = str2Boolean(arg);
    }
    
    public Imovel( int id, String tpStr, String arg ) { 
    	this(tpStr, arg);
    	imovelId = id;
    }
	
    public Imovel(
    		String dscIntern, String dscExtern, String acabInterno,
    		String acabExterno, String extr, int quart, int suit, double vlr, 
    		String iptu_, String title, String situac, int frent, int fund, 
    		int ldDireito, int ldEsquerdo, String areaLot, int areaPrivativ, int areaTot,
    		String entreg, double condomin, boolean emplacad, boolean xclusiva 
    		) {

        dscInterna = dscIntern;
        dscExterna = dscExtern;
        acabamentoInterno = acabInterno;
        acabamentoExterno = acabExterno;
        extra = extr;
        quarto = quart;
        suite = suit;
        valor = vlr;
        iptu = iptu_;
        titulo = title;
        situacao.setSituacao(situac);
        frente = frent;
        fundo = fund;
        ladoDireito = ldDireito;
        ladoEsquerdo = ldEsquerdo;
        areaLote = areaLot;
        areaPrivativa = areaPrivativ;
        areaTotal = areaTot;
        entrega = entreg;
        condominio = condomin;
        emplacado = emplacad;
        exclusiva = xclusiva;
    }
    
    public Imovel(int id, String dscIntern, String dscExtern, String acabInterno,
    		String acabExterno, String extr, int quart, int suit, double vlr, 
    		String iptu_, String title, String situac, int frent, int fund, 
    		int ldDireito, int ldEsquerdo, String areaLot, int areaPrivativ, int areaTot,
    		String entreg, double condomin, boolean emplacad, boolean xclusiva ) {
    	
    	this( 
			dscIntern, dscExtern, acabInterno, acabExterno, extr, quart, suit, vlr, iptu_, 
			title, situac, frent, fund, ldDireito, ldEsquerdo, areaLot, areaPrivativ, areaTot, 
			entreg, condomin, emplacad, xclusiva 
			);
    	imovelId = id;
    }
    
	//    Getts and Setts
    public Integer getImovelId() {
        return imovelId;
    }

    public void setImovelId(Integer imovelId) {
        this.imovelId = imovelId;
    }

    public String getDscInterno() {
        return dscInterna;
    }

    public void setDscInterno(String dscInterna) {
        this.dscInterna = dscInterna;
    }

    public String getDscExterno() {
        return dscExterna;
    }

    public void setDscExterno(String dscExterna) {
        this.dscExterna = dscExterna;
    }

    public String getAcabamentoInterno() {
        return acabamentoInterno;
    }

    public void setAcabamentoInterno(String acabamentoInterno) {
        this.acabamentoInterno = acabamentoInterno;
    }

    public String getAcabamentoExterno() {
        return acabamentoExterno;
    }

    public void setAcabamentoExterno(String acabamentoExterno) {
        this.acabamentoExterno = acabamentoExterno;
    }

    public String getExtra() {
        return extra;
    }

    public void setExtra(String extra) {
        this.extra = extra;
    }

    public Integer getQuarto() {
        return quarto;
    }

    public void setQuarto(Integer quarto) {
        this.quarto = quarto;
    }

    public Integer getSuite() {
        return suite;
    }

    public void setSuite(Integer suite) {
        this.suite = suite;
    }

    public double getValor() {
        return valor;
    }

    public void setValor(double valor) {
        this.valor = valor;
    }

    public String getIptu() {
        return iptu;
    }

    public void setIptu(String iptu) {
        this.iptu = iptu;
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public Integer getFrente() {
        return frente;
    }

    public void setFrente(Integer frente) {
        this.frente = frente;
    }

    public Integer getFundo() {
        return fundo;
    }

    public void setFundo(Integer fundo) {
        this.fundo = fundo;
    }

    public Integer getLadoEsquerdo() {
        return ladoEsquerdo;
    }

    public void setLadoEsquerdo(Integer ladoEsquerdo) {
        this.ladoEsquerdo = ladoEsquerdo;
    }

    public Integer getLadoDireito() {
        return ladoDireito;
    }

    public void setLadoDireito(Integer ladoDireito) {
        this.ladoDireito = ladoDireito;
    }

    public String getAreaLote() {
        return areaLote;
    }

    public void setAreaLote(String areaLote) {
        this.areaLote = areaLote;
    }

    public Integer getAreaPrivativa() {
        return areaPrivativa;
    }

    public void setAreaPrivativa(Integer areaPrivativa) {
        this.areaPrivativa = areaPrivativa;
    }

    public Integer getAreaTotal() {
        return areaTotal;
    }

    public void setAreaTotal(Integer areaTotal) {
        this.areaTotal = areaTotal;
    }

    public String getEntrega() {
        return entrega;
    }

    public void setEntrega(String entrega) {
        this.entrega = entrega;
    }

    public Double getCondominio() {
        return condominio;
    }

    public void setCondominio(Double condominio) {
        this.condominio = condominio;
    }

    public Boolean getEmplacado() {
        return emplacado;
    }

    public void setEmplacado(Boolean emplacado) {
        this.emplacado = emplacado;
    }

    public Boolean getExclusiva() {
        return exclusiva;
    }

    public void setExclusiva(Boolean isExclusiva) {
        this.exclusiva = isExclusiva;
    }

    public String getFoto() {
        return foto;
    }

    public void setFoto(String foto) {
        this.foto = foto;
    }

    public List<AcompanhamentoJuridico> getAcompanhamentoJuridicoList() {
        return acompanhamentoJuridicoList;
    }

    public void setAcompanhamentoJuridicoList(List<AcompanhamentoJuridico> acompanhamentoJuridicoList) {
        this.acompanhamentoJuridicoList = acompanhamentoJuridicoList;
    }

    public TipoImovel getTipoImovel() {
        return tipoImovel;
    }

    public void setTipoImovel(TipoImovel tipoImovel) {
        this.tipoImovel = tipoImovel;
    }

    public Situacao getSituacao() {
        return situacao;
    }

    public void setSituacao(Situacao situacao) {
        this.situacao = situacao;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    public Pessoa getPessoa1() {
        return pessoa1;
    }

    public void setPessoa1(Pessoa pessoa1) {
        this.pessoa1 = pessoa1;
    }

    public Origem getOrigem() {
        return origem;
    }

    public void setOrigem(Origem origem) {
        this.origem = origem;
    }

    public Negocio getNegocio() {
        return negocio;
    }

    public void setNegocio(Negocio negocio) {
        this.negocio = negocio;
    }

    public Finalidade getFinalidade() {
        return finalidade;
    }

    public void setFinalidade(Finalidade finalidade) {
        this.finalidade = finalidade;
    }

    public Face getFace() {
        return face;
    }

    public void setFace(Face face) {
        this.face = face;
    }

    public Empresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }

    public Classificacao getClassificacao() {
        return classificacao;
    }

    public void setClassificacao(Classificacao classificacao) {
        this.classificacao = classificacao;
    }

    public List<AcompanhamentoFisico> getAcompanhamentoFisicoList() {
        return acompanhamentoFisicoList;
    }

    public void setAcompanhamentoFisicoList(List<AcompanhamentoFisico> acompanhamentoFisicoList) {
        this.acompanhamentoFisicoList = acompanhamentoFisicoList;
    }

    public Object[] getValues() {
    	
    	Object[] values = {
    			imovelId, dscInterna, dscExterna, acabamentoInterno, acabamentoExterno, extra, 
    			quarto, suite, valor, iptu, titulo, situacao.getSituacao(), frente, fundo, ladoDireito,
    			ladoEsquerdo, areaLote, areaPrivativa, areaTotal, entrega, condominio, emplacado, exclusiva 
    			};
    	
    	return values;
    }
    
    
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (imovelId != null ? imovelId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Imovel)) {
            return false;
        }
        Imovel other = (Imovel) object;
        if ((this.imovelId == null && other.imovelId != null) || (this.imovelId != null && !this.imovelId.equals(other.imovelId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.imob.modelo.Imovel[imovelId=" + imovelId + "]";
    }

}
